package com.spsoft.einvoicetodmz.service;

import com.spsoft.core.model.Result;
import com.spsoft.core.model.leqidmz.param.*;
import com.spsoft.core.model.leqidmz.param.collect.*;
import com.spsoft.core.model.leqidmz.response.*;
import com.spsoft.core.model.leqidmz.response.collect.*;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import java.util.List;

/**
 * 调用DMZ接口客户端
 *
 * @author : chenxudong
 * @date : 2024/1/26 9:54
 */
@Validated
public interface DmzApiClientService {

    //=====发票基础能力接口=====
    /**
     * 查询纳税人基本信息
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<QueryEnterpriseInfoVO> queryEnterpriseInfo(@Valid BaseNsrRequestParams params, String tdys);

    /**
     * 查询纳税人风险信息
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<QueryEnterpriseInfoRiskVO> queryEnterpriseRisk(@Valid BaseNsrRequestParams params, String tdys);

    /**
     * 查询税收分类编码信息
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<QueryClassifyCodeVO> queryClassifyCode(@Valid QueryClassifyCodeParams params, String tdys);

    /**
     * 查询可用税率信息
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<QueryAvalibleTaxRateVo> queryAvalibleTaxRate(@Valid BaseNsrRequestParams params, String tdys);

    /**
     * 查询授信额度信息
     * 查询授信额度有时间间隔，最小时间间隔为一个小时。
     * 请企业根据企业自身业务情况，合理安排分配查询授信额度时间
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<QueryCreditlimitVO> queryCreditLimit(@Valid BaseNsrRequestParams params, String tdys);

    /**
     * 调整授信额度有效期
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<QueryCreditPeriodVO> queryCreditPeriod(@Valid QueryCreditPeriodParams params, String tdys);

    /**
     * 下载/退回授信额度
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<ApplyCreditVO> applyCredit(@Valid ApplyCreditParams params, String tdys);

    /**
     * 获取数电票批量预赋码信息
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<AssignedCodeResponseVO> assignedCode(@Valid AssignedCodeParams params, String tdys);

    /**
     * 数电票上传
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<UploadInvoiceVO> uploadInvoice(@Valid List<UploadInvoiceParams> params, String tdys);

    /**
     * 查询数电票上传结果
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<QueryUploadInvoiceStatusVO> queryUploadInvoiceStatus(@Valid QueryUploadInvoiceStatusParam params, String tdys);

    /**
     * 上传发票汇总确认信息
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<BaseResponseVO> uploadInvoiceSummary(@Valid UploadInvoiceSummaryParam params, String tdys);

    /**
     * 查询发票汇总确认信息
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<QueryUploadInvoiceSummaryVO> queryUploadInvoiceSummary(@Valid QueryUploadInvoiceSummaryParam params, String tdys);

    /**
     * 数电红字确认单申请
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<ApplyRedConfirmVO> applyRedConfirm(@Valid ApplyRedConfirmDetailParam params, String tdys);

    /**
     * 数电红字确认单确认
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<ConfirmRedConfirmVO> confirmRedConfirm(@Valid ConfirmRedConfirmParam params, String tdys);

    /**
     * 查询数电红字确认单明细
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<QueryRedConfirmDetailVO> queryRedConfirmDetail(@Valid QueryRedConfirmDetailParam params, String tdys);

    /**
     * 查询数电红字确认单列表
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<QueryRedConfirmListVO> queryRedConfirmList(@Valid QueryRedConfirmListParam params, String tdys);

    /**
     * 查询差额征税编码
     * @param params 请求参数
     * @param tdys 特定要素类型代码
     */
    Result<QueryDifferentialTaxationVO> queryDifferentialTaxCode(@Valid BaseUserInfoParam params, String tdys);



    //=====发票归集能力接口=====
    /**
     * 批量发票下载申请
     */
    Result<BatchLoadInvoiceVO> batchLoadInvoice(@Valid BatchLoadInvoiceParam params);

    /**
     * 批量发票下载申请反馈
     */
    Result<BatchLoadInvoiceFeedbackVO> batchLoadInvoiceFeedback(@Valid BatchLoadInvoiceFeedbackParam params);

    /**
     * 查询增量下载发票信息
     */
    Result<IncLoadInvoiceQueryVO> incLoadInvoiceQuery(@Valid IncLoadInvoiceQueryParam params);

    /**
     * 发票风险信息查询
     */
    Result<InvoiceRiskQueryVO> invoiceRiskQuery(@Valid InvoiceRiskQueryParam params);

    /**
     * 发票用途状态信息查询
     */
    Result<InvoiceUsedStatusQueryVO> invoiceUsedStatusQuery(@Valid InvoiceUsedStatusQueryParam params);

}
